package com.foton.mybatis.util;

import com.foton.mybatis.configration.Configration;
import com.foton.mybatis.eunm.SqlType;
import com.foton.mybatis.model.MappedStatement;
import lombok.extern.slf4j.Slf4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @Author RenPu
 * @Date 2023/3/29 16:51
 * @Version 1.0
 * @Description:
 **/

public class XmlUtil {


    public static void readMapperXml(File file, Configration configration) {
        try {
        //创建读取器
        SAXReader  saxReader= new SAXReader();
        saxReader.setEncoding(Constant.CHARSET_UTF8); //设置字符集

        //读取文件内容
        Document document = saxReader.read(file);

         //获取xml的根元素
         Element rootElement = document.getRootElement();

         //不是mapper根元素的，文件有误
         if(!rootElement.getName().equals(Constant.XML_ROOT_LABEL)){
             System.out.println("mapper.xml文件的根元素标签，不是mapper不符合规则，请进行检查！！！！");
             return;
         }

            //Mapper.xml中的namespace标签的值
            String namespace = rootElement.attributeValue(Constant.XML_SELECT_NAMESPACE);
            List<MappedStatement> statement = new ArrayList<>();

            //遍历解析Mapper.xml中的具体的标签，例如select，update,delete等
            for (Iterator iterator = rootElement.elementIterator();iterator.hasNext();){
                Element element=(Element)iterator.next();

                String name = element.getName();

                MappedStatement mappedStatement = new MappedStatement();

                if(SqlType.SELECT.value().equals(name)){
                    String resultType = element.attributeValue(Constant.XML_SELECT_RESULTTYPE);
                    mappedStatement.setResultType(resultType);
                    mappedStatement.setSqlcommondType(SqlType.SELECT);
                }else if(SqlType.UPDATE.value().equals(name)){
                    mappedStatement.setSqlcommondType(SqlType.UPDATE);
                }else {
                    //其他标签自行实现
                    System.out.println("当前不支持此标签解析："+element);
                    mappedStatement.setSqlcommondType(SqlType.DEFAULT);
                }

                String sqlId=namespace+"."+element.attributeValue(Constant.XML_ELEMENT_ID);


                mappedStatement.setSql(sqlId);
                mappedStatement.setNameSpace(namespace);
                mappedStatement.setSql("");

                statement.add(mappedStatement);

                configration.addMapperedStatment(sqlId,mappedStatement);
                configration.addMapper(Class.forName(namespace));
            }








        } catch (Exception e) {
            e.printStackTrace();
        }






    }
}
